package com.chenliwu.demo.reflection;

import java.lang.reflect.Method;

/**
 * 反射示例
 *
 * @author chenliwu
 * @since 2022-01-28
 */
public class ReflectionExample {

    public static void main(String[] args) {
        // testGetClass();
        testGetMethodAndAtt();
    }

    /**
     * 获取Class对象的方法
     */
    static void testGetClass() {
        try {
            // 方法1：Class.forName('类名字符串')  注意类名字符串必须全称，包名+类
            String classFullName = "com.chenliwu.demo.reflection.TargetObject";
            Class cls1 = Class.forName(classFullName);
            System.out.println(cls1);
            System.out.println();

            // 方法2： 类名.class
            Class cls2 = TargetObject.class;
            System.out.println(cls2);
            System.out.println();

            // 方法3：对象实例.getClass()
            TargetObject targetObject = new TargetObject();
            Class cls3 = targetObject.getClass();
            System.out.println(cls3);
            System.out.println();

            // 方法4："类名字符串".getClass()
            Class cls4 = classFullName.getClass();
            System.out.println(cls4);
            System.out.println();

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            System.out.println("异常：" + e.getMessage());
        }
    }

    /**
     * 获取成员方法和成员变量
     */
    static void testGetMethodAndAtt() {
        Class cls = TargetObject.class;

        // 获取全部的public的方法（包括从基类继承的、从接口实现的所有public方法）
        Method[] methods = cls.getMethods();
        System.out.println("获取全部的public的方法（包括从基类继承的、从接口实现的所有public方法）");
        for (Method method : methods) {
            System.out.println(method);
        }
        System.out.println();




    }

}
